import VNode from "../vdom/vNode.js"
import {
    prepareRender,
    getTemplate2VnodeMap,
    getVnode2TemplateMap
} from "./render.js"
export function initMount(FVue) {
    FVue.prototype.$mount = function (el) {
        let vm = this;
        let rootDom = document.getElementById(el);
        mount(vm, rootDom);
    }
}

export function mount(vm, elm) {
    // 进行挂载
    vm._vnode = constructVNode(vm, elm, parent); // 根节点 ，传入虚拟DOM树的时候，传入DOM树的根节点就可以
    // 进行预备渲染(建立渲染索引，通过模板查找VNode，通过VNode查找模板)
    prepareRender(vm, vm._vnode);
}

function constructVNode(vm, elm, parent) { //深度优先搜索 得到虚拟DOM树
    // 当前节点
    let vnode = null;
    let children = []; // 子节点
    let text = getNodeText(elm); // 文本节点
    let data = null; // 数据
    let nodeType = elm.nodeType; // 虚拟类型
    let tag = elm.nodeName; // 类型名称
    vnode = new VNode(tag, elm, children, text, data, parent, nodeType); //虚拟DOM
    // 当前标签下的子节点
    let childs = vnode.elm.childNodes;
    for (let i = 0; i < childs.length; i++) {
        let childNodes = constructVNode(vm, childs[i], vnode);
        if (childNodes instanceof VNode) { //返回单一节点的时候
            vnode.children.push(childNodes);
        } else { //返回节点数组
            vnode.children = vnode.children.concat(childNodes)
        }
    }
    return vnode;
}

function getNodeText(elm) {
    if (elm.nodeType == 3) {
        return elm.nodeValue;
    } else {
        return "";
    }
}